﻿using DotNetMVC.OA.IBLL;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;

namespace DotNetMVC.OA.UI.Portal.Controllers
{

    public class UserLoginController : BaseController
    {
         public IUserInfoService UserInfoService { get; set; }

        public UserLoginController()
        {
            //不进行登录验证
            this.IsCheckUserLogin = false;
        }

        // GET: UserLogin
        public ActionResult Index()
        {
            return View();
        }

        #region 验证码
        public ActionResult ShowVCode()
        {
            Common.ValidateCode validateCode = new Common.ValidateCode();
            string strCode = validateCode.CreateValidateCode(4);

            //验证码放到 Session
            Session["VCode"] = strCode;

            byte[] imgBytes = validateCode.CreateValidateGraphic(strCode);

            return File(imgBytes, @"image/jepg");
        }
        #endregion

        #region 处理登录的表单
        [HttpPost]
        public ActionResult ProcessLogin()
        {
            //第一步：处理验证码
            //拿到表单验证码
            #region 验证码
            string strCode = Request["vCode"];
            string sessionCode = Session["VCode"] as string;
            Session["VCode"] = null;
            if (string.IsNullOrEmpty(sessionCode) || strCode != sessionCode)
            {
                return Content("验证码错误！");
            }
            #endregion

            //第二步：处理验证用户名和密码
            string name = Request["LoginCode"];
            string pwd = Request["LoginPwd"];
            short delNormal = (short)Model.Enum.DelFlagEnum.Normal;
            var userInfo = UserInfoService.GetEntities(u=>u.UName==name&&u.Pwd==pwd&&u.DelFlag==delNormal).FirstOrDefault();
            if (userInfo==null)
            {
                return Content("用户名密码错误！");
            }

            //Session["loginUser"] = userInfo;

            //用memcache+cookie代替之。
            //立即分配一个标志，Guid。把标志作为 mm存储数据的key，把用户对象放到 mm。 把guid写到客户端cookie里面去。
            string userLoginId = Guid.NewGuid().ToString();

            //把用户的数据写到mm,怎么解决变化：写到不同地方去，可能同时写入多个地方。
            Common.Cache.CacheHelper.AddCache(userLoginId, userInfo, DateTime.Now.AddMinutes(20));

            //往客户端写入cookie
            Response.Cookies["userLoginId"].Value = userLoginId;

            //如果正确，跳转到首页
            return Content("ok");
        }
        #endregion
    }
}